package com.testplatform.aitestplatform.service.impl;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.testplatform.aitestplatform.domain.TestCases;
import com.testplatform.aitestplatform.domain.TestRequset;
import com.testplatform.aitestplatform.utils.BaseTest;
import com.testplatform.aitestplatform.utils.OnlinePdfReader;
import com.testplatform.aitestplatform.utils.PDFUtil;
import com.testplatform.common.exception.base.BaseException;
import com.testplatform.common.utils.StringUtils;
import io.restassured.response.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import com.testplatform.aitestplatform.mapper.AiUseCaseGenerationMapper;
import com.testplatform.aitestplatform.domain.AiUseCaseGeneration;
import com.testplatform.aitestplatform.service.IAiUseCaseGenerationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.web.client.RestTemplate;

import static net.sf.jsqlparser.parser.feature.Feature.replace;

/**
 * 用例生成Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-10-27
 */
@Service
public class AiUseCaseGenerationServiceImpl extends ServiceImpl<AiUseCaseGenerationMapper, AiUseCaseGeneration> implements IAiUseCaseGenerationService
{
    @Autowired
    private AiUseCaseGenerationMapper aiUseCaseGenerationMapper;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 查询用例生成
     * 
     * @param id 用例生成主键
     * @return 用例生成
     */
    @Override
    public AiUseCaseGeneration selectAiUseCaseGenerationById(Long id)
    {
        return getById(id);
    }

    /**
     * 查询用例生成列表
     * 
     * @param aiUseCaseGeneration 用例生成
     * @return 用例生成
     */
    @Override
    public List<AiUseCaseGeneration> selectAiUseCaseGenerationList(AiUseCaseGeneration aiUseCaseGeneration)
    {
        return aiUseCaseGenerationMapper.selectAiUseCaseGenerationList(aiUseCaseGeneration);
    }

    /**
     * 新增用例生成
     * 
     * @param aiUseCaseGeneration 用例生成
     * @return 结果
     */
    @Override
    public int insertAiUseCaseGeneration(AiUseCaseGeneration aiUseCaseGeneration)

    {
        String content  = OnlinePdfReader.readPdfFromUrl(aiUseCaseGeneration.getFileName());

        redisTemplate.opsForHash().put("prd",aiUseCaseGeneration.getFileName(),content );
        return save(aiUseCaseGeneration) ? 1 : 0;
    }

    /**
     * 修改用例生成
     * 
     * @param aiUseCaseGeneration 用例生成
     * @return 结果
     */
    @Override
    public int updateAiUseCaseGeneration(AiUseCaseGeneration aiUseCaseGeneration)
    {
        return updateById(aiUseCaseGeneration) ? 1 : 0;
    }

    /**
     * 批量删除用例生成
     * 
     * @param ids 需要删除的用例生成主键
     * @return 结果
     */
    @Override
    public int deleteAiUseCaseGenerationByIds(Long[] ids)
    {
        return removeByIds(Arrays.asList(ids)) ? 1 : 0;
    }

    /**
     * 删除用例生成信息
     * 
     * @param id 用例生成主键
     * @return 结果
     */
    @Override
    public int deleteAiUseCaseGenerationById(Long id)
    {
        return removeById(id) ? 1 : 0;
    }

    @Override
    public List<TestCases> generatedTestCaseAi(AiUseCaseGeneration aiUseCaseGeneration) {
        String prd = redisTemplate.opsForHash().get("prd", aiUseCaseGeneration.getFileName()).toString();
        String prompt = getPrompt(prd);

        String string = prompt.replaceAll("\n", "");
        String string1 = string.replaceAll("\r", "");
        String replaceAll = string1.replaceAll("\u0001", "");
        String cleanedContent = replaceAll.replaceAll("\\\\", "");
        TestRequset testRequset =  new TestRequset();
        testRequset.setUrl("http://127.0.0.1:11434/api/chat");
        testRequset.setMethod("POST");
        Map<String, Object> params = new HashMap<>();
        params.put("Content-Type","application/json; charset=utf-8");
        testRequset.setHeaders(params);
        testRequset.setBody(bodyRequest(cleanedContent));
        Response request = BaseTest.request(testRequset);
        String jsonString  = request.jsonPath().get("message.content").toString();
        String string2 = jsonString.replaceAll("\n", "");
        String string3 = string2.replaceAll("\\\\", "");
        String[] strings = string3.split("\\[");
        String jsonString1 = strings[0];
        System.out.println(string3);

        return List.of();
    }


    public Object getUserField(String prd, String fileName) {


        return redisTemplate.opsForHash().get(prd, fileName);
    }


    private String getPrompt(String content) {
        String prompt = "你是一位经验丰富的软件测试工程师，擅长设计高覆盖率的测试场景。请根据以下需求生成详细的功能测试用例" +
                "需求内容如下：\n" +
                content + "    \n" +
                "\n" +
                "要求：\n" +
                "1. 验证软件功能是否按照需求规格正常工作。需覆盖所有正常功能点和显性业务规则；\n" +
                "2. 通对具有明确范围或长度限制的输入字段，必须测试其边界及边界附近的值这是发现潜在错误的高发区。" +
                "3. 针对复杂的业务逻辑，分析输入条件（因）与输出结果（果）的逻辑关系，从而系统地设计测试用例，以减少冗余并覆盖条件组合" +
                "4. 验证功能是否符合需求，覆盖所有声明的业务规则" +
                "5. 作为一个测试专家，需要对我要求以上要求在进行补充" +
                "输出要求：\n" +
                "最后，将以上结果输出为纯JSON格式，不要包含其他的文字说明，也不要出现Markdown语法相关的文字，所有的返回结果都是json，详细格式如下：\n" +
                "\n" +
                "{\n" +
                "  \"title\": 根据需求生成测试标题\",\n" +
                "  \"module\": \"根据需求生成测试模块\",\n" +
                "  \"description\": \"根据需求详细信息\",\n" +
                "  \"testSteps\": \"根据需求生成步骤\",\n" +
                "  \"expectedResult\": \"生成预期结果\",\n" +
                "  \"priority\": \"测试用例等级\",\n" +
                "}";
        return prompt;
    }

    public String bodyRequest(String content){

        ObjectMapper objectMapper = new ObjectMapper();

        // 构建根对象
        ObjectNode requestBody = objectMapper.createObjectNode();
        requestBody.put("model", "qwen3:14b");
        requestBody.put("stream", false);

        // 构建 messages 数组中的第一个消息对象
        ObjectNode message = objectMapper.createObjectNode();
        message.put("role", "user");
        message.put("content", content); // 库会自动对 content 中的特殊字符进行转义

        // 将消息对象放入数组
        requestBody.putArray("messages").add(message);

        // 将整个对象转换为标准 JSON 字符串
        return requestBody.toString();

    }


}
